gtkplacessidebar: Show busy spinner in sidebar row during mount ops
authorsegfault <segfault@riseup.net>
Sun, 22 Jul 2018 11:47:46 +0000 (13:47 +0200)
committersegfault <segfault@riseup.net>
Sun, 22 Jul 2018 15:04:05 +0000 (17:04 +0200)
gtk/gtkplacessidebar.c
gtk/gtksidebarrow.c
gtk/gtksidebarrowprivate.h
gtk/ui/gtksidebarrow.ui

index 810c085d0fba17772fdcb4201bad5ea8ac2e3755..17fee6d5f57b33d3b37e15758dde72292f205859 100644 (file)
@@ -2398,7 +2398,8 @@ volume_mount_cb (GObject      *source_object,
                  GAsyncResult *result,
                  gpointer      user_data)
 {
-  GtkPlacesSidebar *sidebar = GTK_PLACES_SIDEBAR (user_data);
+  GtkSidebarRow *row = GTK_SIDEBAR_ROW (user_data);
+  GtkPlacesSidebar *sidebar;
   GVolume *volume;
   GError *error;
   gchar *primary;
@@ -2406,6 +2407,7 @@ volume_mount_cb (GObject      *source_object,
   GMount *mount;
 
   volume = G_VOLUME (source_object);
+  g_object_get (row, "sidebar", &sidebar, NULL);
 
   error = NULL;
   if (!g_volume_mount_finish (volume, result, &error))
@@ -2423,6 +2425,7 @@ volume_mount_cb (GObject      *source_object,
     }
 
   sidebar->mounting = FALSE;
+  gtk_sidebar_row_set_busy (row, FALSE);
 
   mount = g_volume_get_mount (volume);
   if (mount != NULL)
@@ -2436,32 +2439,42 @@ volume_mount_cb (GObject      *source_object,
       g_object_unref (G_OBJECT (mount));
     }
 
+  g_object_unref (row);
   g_object_unref (sidebar);
 }
 
 static void
-mount_volume (GtkPlacesSidebar *sidebar,
-              GVolume          *volume)
+mount_volume (GtkSidebarRow *row,
+              GVolume       *volume)
 {
+  GtkPlacesSidebar *sidebar;
   GMountOperation *mount_op;
 
+  g_object_get (row, "sidebar", &sidebar, NULL);
+
   mount_op = get_mount_operation (sidebar);
   g_mount_operation_set_password_save (mount_op, G_PASSWORD_SAVE_FOR_SESSION);
 
+  g_object_ref (row);
   g_object_ref (sidebar);
-  g_volume_mount (volume, 0, mount_op, NULL, volume_mount_cb, sidebar);
+  g_volume_mount (volume, 0, mount_op, NULL, volume_mount_cb, row);
 }
 
 static void
-open_drive (GtkPlacesSidebar   *sidebar,
+open_drive (GtkSidebarRow      *row,
             GDrive             *drive,
             GtkPlacesOpenFlags  open_flags)
 {
+  GtkPlacesSidebar *sidebar;
+
+  g_object_get (row, "sidebar", &sidebar, NULL);
+
   if (drive != NULL &&
       (g_drive_can_start (drive) || g_drive_can_start_degraded (drive)))
     {
       GMountOperation *mount_op;
 
+      gtk_sidebar_row_set_busy (row, TRUE);
       mount_op = get_mount_operation (sidebar);
       g_drive_start (drive, G_DRIVE_START_NONE, mount_op, NULL, drive_start_from_bookmark_cb, NULL);
       g_object_unref (mount_op);
@@ -2469,15 +2482,20 @@ open_drive (GtkPlacesSidebar   *sidebar,
 }
 
 static void
-open_volume (GtkPlacesSidebar   *sidebar,
+open_volume (GtkSidebarRow      *row,
              GVolume            *volume,
              GtkPlacesOpenFlags  open_flags)
 {
+  GtkPlacesSidebar *sidebar;
+
+  g_object_get (row, "sidebar", &sidebar, NULL);
+
   if (volume != NULL && !sidebar->mounting)
     {
       sidebar->mounting = TRUE;
       sidebar->go_to_after_mount_open_flags = open_flags;
-      mount_volume (sidebar, volume);
+      gtk_sidebar_row_set_busy (row, TRUE);
+      mount_volume (row, volume);
     }
 }
 
@@ -2534,11 +2552,11 @@ open_row (GtkSidebarRow      *row,
     }
   else if (volume != NULL)
     {
-      open_volume (sidebar, volume, open_flags);
+      open_volume (row, volume, open_flags);
     }
   else if (drive != NULL)
     {
-      open_drive (sidebar, drive, open_flags);
+      open_drive (row, drive, open_flags);
     }
 
   g_object_unref (sidebar);
@@ -2875,7 +2893,7 @@ mount_shortcut_cb (GSimpleAction *action,
                 NULL);
 
   if (volume != NULL)
-    mount_volume (sidebar, volume);
+    mount_volume (sidebar->context_row, volume);
 
   g_object_unref (volume);
 }
index effbb1fb3bee6d940abeb637372cc71b44180038..4e88a7fed99f32c3b37c021bbc2349033832457d 100644 (file)
@@ -28,6 +28,7 @@
 #include "gtkstylecontext.h"
 #include "gtkrevealer.h"
 #include "gtkselection.h"
+#include "gtkspinner.h"
 
 #ifdef HAVE_CLOUDPROVIDERS
 #include <cloudproviders/cloudprovidersaccount.h>
@@ -57,6 +58,7 @@ struct _GtkSidebarRow
   GtkPlacesSidebar *sidebar;
   GtkWidget *event_box;
   GtkWidget *revealer;
+  GtkWidget *busy_spinner;
 };
 
 G_DEFINE_TYPE (GtkSidebarRow, gtk_sidebar_row, GTK_TYPE_LIST_BOX_ROW)
@@ -621,6 +623,7 @@ gtk_sidebar_row_class_init (GtkSidebarRowClass *klass)
   gtk_widget_class_bind_template_child (widget_class, GtkSidebarRow, eject_button);
   gtk_widget_class_bind_template_child (widget_class, GtkSidebarRow, event_box);
   gtk_widget_class_bind_template_child (widget_class, GtkSidebarRow, revealer);
+  gtk_widget_class_bind_template_child (widget_class, GtkSidebarRow, busy_spinner);
 
   gtk_widget_class_bind_template_callback (widget_class, on_child_revealed);
   gtk_widget_class_set_css_name (widget_class, "row");
@@ -658,3 +661,12 @@ gtk_sidebar_row_get_event_box (GtkSidebarRow *self)
 {
   return self->event_box;
 }
+
+void
+gtk_sidebar_row_set_busy (GtkSidebarRow *row,
+                          gboolean       is_busy)
+{
+  g_return_if_fail (GTK_IS_SIDEBAR_ROW (row));
+
+  gtk_widget_set_visible (row->busy_spinner, is_busy);
+}
index 5b53a4b145311b3231039b139cae49e7756c26ed..35797e7cb761cbbf401d1a4d76c4c8d7602f8907 100644 (file)
@@ -54,6 +54,8 @@ void           gtk_sidebar_row_set_start_icon   (GtkSidebarRow *self,
                                                  GIcon         *icon);
 void           gtk_sidebar_row_set_end_icon     (GtkSidebarRow *self,
                                                  GIcon         *icon);
+void           gtk_sidebar_row_set_busy         (GtkSidebarRow *row,
+                                                 gboolean       is_busy);
 
 G_END_DECLS
 
index 3cb69478575617e619fe410852789e5dcaa3b0e4..1fca7e831122ce275bfd29bc7c386210d9ca2991 100644 (file)
                     </style>
                   </object>
                 </child>
+                <child>
+                  <object class="GtkSpinner" id="busy_spinner">
+                    <property name="active">1</property>
+                    <property name="halign">center</property>
+                    <property name="valign">center</property>
+                    <property name="margin-start">4px</property>
+                    <property name="no-show-all">1</property>
+                  </object>
+                </child>
               </object>
             </child>
           </object>